JasmineJS এ Spies (স্পাই) এমন একটি শক্তিশালী ফিচার যা আপনাকে ফাংশনের আচরণ ট্র্যাক করতে, আর্গুমেন্ট যাচাই করতে এবং রিটার্ন ভ্যালু বা ত্রুটি (error) পরীক্ষা করতে সহায়তা করে। স্পাই ব্যবহার করে আপনি আপনার কোডের কোনো ফাংশনকে "mock" বা "stub" করতে পারেন, যা টেস্ট করার জন্য বিশেষভাবে তৈরি করা হয়। এগুলো কাস্টম লজিকের মাধ্যমে টেস্ট চলাকালীন কোডের নির্দিষ্ট অংশ পরীক্ষা করতে ব্যবহৃত হয়।
এখানে আমরা Advanced Spy Techniques নিয়ে আলোচনা করব, যেগুলি আপনাকে আরও কার্যকরভাবে Jasmine এর স্পাই ফিচার ব্যবহার করতে সহায়তা করবে।
স্পাই-এর মৌলিক ধারণা
JasmineJS এ spyOn() মেথড ব্যবহার করে একটি ফাংশন স্পাই করা হয়। স্পাই একে অপরের কার্যকারিতা পরিবর্তন না করে, কেবলমাত্র ফাংশনটি ট্র্যাক করে। এটি আর্গুমেন্ট এবং রিটার্ন ভ্যালু সংক্রান্ত তথ্যও সংগ্রহ করে।
spyOn(object, 'methodName');
এখানে:
object: যেখানে ফাংশনটি অবস্থিত।methodName: যেই মেথড/ফাংশনটি আপনি স্পাই করতে চান।
স্পাই সাধারণত তিনটি প্রধান কাজ করে:
- আর্গুমেন্টের মান ট্র্যাক করে।
- রিটার্ন ভ্যালু বা ফলাফল রেকর্ড করে।
- ফাংশনটির কল ট্র্যাক করে।
Advanced Spy Techniques
১. Spying on a Method and Checking Call Counts
Jasmine এর স্পাই ফিচার ব্যবহার করে আপনি ফাংশনটির কতবার কল করা হয়েছে তা ট্র্যাক করতে পারেন। এটি বিশেষভাবে তখন দরকারী, যখন আপনি চান জানতে, একটি ফাংশন কতবার কার্যকরী হয়েছে।
describe("Spy on call count", function() {
it("should track how many times the function is called", function() {
const obj = {
greet: function(name) {
return `Hello, ${name}!`;
}
};
spyOn(obj, 'greet');
obj.greet("John");
obj.greet("Jane");
expect(obj.greet).toHaveBeenCalledTimes(2);
});
});
এখানে:
toHaveBeenCalledTimes(2)যাচাই করছে যেgreet()ফাংশনটি ২ বার কল করা হয়েছে।
২. Using and.callThrough() to Call the Original Function
যখন আপনি একটি ফাংশন স্পাই করেন, আপনি চাইলে আসল ফাংশনটির আচরণও রাখতে পারেন। and.callThrough() মেথড ব্যবহার করে স্পাই করা ফাংশনটির আসল কার্যকারিতা চালু রাখুন এবং ট্র্যাক করুন।
describe("Spy with callThrough", function() {
it("should call the original function", function() {
const obj = {
greet: function(name) {
return `Hello, ${name}!`;
}
};
spyOn(obj, 'greet').and.callThrough();
const result = obj.greet("John");
expect(result).toBe("Hello, John!");
expect(obj.greet).toHaveBeenCalled();
});
});
এখানে:
and.callThrough()স্পাইটি আসলgreetফাংশনের কার্যকারিতা বজায় রেখেছে এবং টেস্ট কেসে আর্গুমেন্ট এবং রিটার্ন ভ্যালু ট্র্যাক করা হয়েছে।
৩. Using and.returnValue() to Return a Custom Value
যখন আপনি চান যে একটি স্পাই করা ফাংশন নির্দিষ্ট একটি রিটার্ন ভ্যালু প্রদান করুক, তখন and.returnValue() ব্যবহার করতে পারেন। এটি একটি কাস্টম রিটার্ন ভ্যালু দেয়, যেটি আসল ফাংশনটির রিটার্ন ভ্যালু পরিবর্তন করে।
describe("Spy with returnValue", function() {
it("should return a custom value", function() {
const obj = {
greet: function(name) {
return `Hello, ${name}!`;
}
};
spyOn(obj, 'greet').and.returnValue("Hello, Guest!");
const result = obj.greet("John");
expect(result).toBe("Hello, Guest!");
});
});
এখানে:
and.returnValue("Hello, Guest!")স্পাই করাgreetফাংশনটি"Hello, Guest!"রিটার্ন করবে, যা আসল রিটার্ন ভ্যালুকে ওভাররাইড করে।
৪. Using and.callFake() for Custom Function Behavior
and.callFake() ব্যবহার করে আপনি স্পাই করা ফাংশনের জন্য একটি কাস্টম ফাংশন তৈরি করতে পারেন, যা মূল ফাংশনের আচরণ সম্পূর্ণরূপে পরিবর্তন করে। এটি তখন দরকারী, যখন আপনি স্পাই করা ফাংশনের জন্য একটি সম্পূর্ণ ভিন্ন কার্যকারিতা প্রয়োগ করতে চান।
describe("Spy with callFake", function() {
it("should use a custom implementation", function() {
const obj = {
greet: function(name) {
return `Hello, ${name}!`;
}
};
spyOn(obj, 'greet').and.callFake(function(name) {
return `Greetings, ${name}!`;
});
const result = obj.greet("John");
expect(result).toBe("Greetings, John!");
});
});
এখানে:
and.callFake()কাস্টম ফাংশন ব্যবহার করা হচ্ছে, যা আসলgreetফাংশনটির কার্যকারিতা সম্পূর্ণরূপে প্রতিস্থাপন করছে।
৫. Using and.throwError() to Simulate an Error
and.throwError() ব্যবহার করে আপনি স্পাই করা ফাংশনের জন্য একটি কাস্টম ত্রুটি (error) সিমুলেট করতে পারেন, যা টেস্টে ত্রুটি সৃষ্টির পরিস্থিতি যাচাই করতে সহায়ক।
describe("Spy with throwError", function() {
it("should throw an error", function() {
const obj = {
greet: function(name) {
if (!name) {
throw new Error("Name is required!");
}
return `Hello, ${name}!`;
}
};
spyOn(obj, 'greet').and.throwError("Name is required!");
expect(function() { obj.greet(); }).toThrowError("Name is required!");
});
});
এখানে:
and.throwError()স্পাই করাgreetফাংশনটিকে একটি ত্রুটি ছুঁড়তে বাধ্য করছে যখন এটি কোনো আর্গুমেন্ট ছাড়া কল করা হয়।
৬. Spy on Methods with Multiple Arguments
আপনি স্পাই করা ফাংশনটির একাধিক আর্গুমেন্ট যাচাই করতে পারেন এবং তার সাথে সংশ্লিষ্ট আচরণ পরীক্ষা করতে পারেন।
describe("Spy with multiple arguments", function() {
it("should track multiple arguments", function() {
const obj = {
multiply: function(a, b) {
return a * b;
}
};
spyOn(obj, 'multiply');
obj.multiply(2, 3);
expect(obj.multiply).toHaveBeenCalledWith(2, 3);
});
});
এখানে:
toHaveBeenCalledWith(2, 3)যাচাই করছে যেmultiplyফাংশনটি2এবং3আর্গুমেন্ট নিয়ে কল হয়েছে কিনা।
সারাংশ
JasmineJS এর Advanced Spy Techniques আপনাকে আপনার কোডের বিভিন্ন দিক আরও গভীরভাবে পরীক্ষা করতে সহায়তা করে। spyOn(), and.callThrough(), and.returnValue(), and.callFake(), এবং and.throwError() এর মতো ফিচারগুলি ব্যবহার করে আপনি ফাংশনগুলির আচরণ ট্র্যাক করতে এবং কাস্টম রিটার্ন ভ্যালু, ত্রুটি সিমুলেশন, বা কাস্টম কার্যকারিতা প্রদান করতে পারেন। এগুলি আপনাকে আরও শক্তিশালী এবং নির্ভুল টেস্টিং করতে সক্ষম করে, যা কোডের ভুল বা অপ্রত্যাশিত আচরণ দ্রুত সনাক্ত করতে সাহায্য করে।
Read more